unit UHilo;

interface

uses
  Classes, SysUtils, Math;

type
  Vect= array [0..31] of double;
  Hilo = class(TThread)
  private
    { Private declarations }
    PuertoFisico, PuertoAbs: integer;
  protected
    procedure Execute; override;
  public
     senalT, senalL: Vect;
     adr: integer;
     dat: integer;
     constructor Create(const prioridad, pFisico, pAbs: integer);
     procedure paintTemperaturaH();
     procedure paintLuzH();
     procedure imprimirDatos();
  end;

implementation
uses
IdSocketHandle, IdThread, UServer;

constructor Hilo.Create(const prioridad, pFisico, pAbs: integer);
var
   i: integer;
begin
  inherited Create(False);
  FreeOnTerminate:= False;
  PuertoFisico:= pFisico;
  PuertoAbs:= pAbs;
  adr:= 0;
  dat:= 0;
   for i:= 0 to Length(senalT)-1 do
   begin
      senalT[i]:= 0;
      senalL[i]:= 0;
   end;
   Priority:= TThreadPriority(prioridad);
end;

FUNCTION PortIn(IOport: WORD): BYTE; ASSEMBLER; REGISTER;
ASM
  MOV DX,AX
  IN AL,DX
END;

PROCEDURE PortOut(IOport: WORD; Value: BYTE ); ASSEMBLER; REGISTER;
ASM
  XCHG DX,AX
  OUT DX,AL
END;


procedure Hilo.Execute;
begin
   while true do
   begin
      dat:= PortIn(PuertoFisico);
      FServer.BroadcastValue(dat);
      if (dat = 254)or(dat = 255) then
      begin
         adr:= dat;
         //PortOut(PuertoFisico, dat);
      end
      else
      begin
         if adr <> 0 then
         begin
            case adr of
               254:
               begin
                  //PortOut(PuertoFisico, round(dat/2.581632605));  //Pongo temperatura
                  Synchronize(paintTemperaturaH);
               end;
               255:
               begin
                  //PortOut(PuertoFisico, dat);
                  Synchronize(paintLuzH);
               end;
            end;
         end;
      end;
   end;
end;

procedure Hilo.paintTemperaturaH();
var
   i: integer;
begin
   FServer.Series1.Clear;
   for i:= Length(senalT)-1 downto 1 do
      senalT[i]:= senalT[i-1];
   senalT[0]:= dat/2.56565656;
   FServer.Series1.AddArray(senalT);
   FServer.ETemperatura.Text:= FloatToStr(Round(dat/2.56565656));
end;

procedure Hilo.paintLuzH();
var
   i: integer;
begin
   FServer.Series2.Clear;
   for i:= Length(senalL)-1 downto 1 do
      senalL[i]:= senalL[i-1];
   senalL[0]:= dat;
   FServer.Series2.AddArray(senalL);
   FServer.ELuz.Text:= IntToStr(dat);
end;

procedure Hilo.imprimirDatos();
begin
   FServer.MMensajes.Lines.Add(IntToStr(dat));
end;

end.

    Source: geocities.com/tiger928rs/txt

               ( geocities.com/tiger928rs)